package com.shuziren.question.service.impl;


import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.shuziren.question.entity.dto.InterviewCategoryDTO;
import com.shuziren.question.entity.QuestionCategory;
import com.shuziren.question.entity.SortTopic;
import com.shuziren.question.mapper.QuestionCategoryMapper;
import com.shuziren.question.mapper.SortandtopicMapper;
import com.shuziren.question.service.QuestionCategoryService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

@Service
@SuppressWarnings("all")
public class QuestionCategoryServiceImpl extends ServiceImpl<QuestionCategoryMapper, QuestionCategory> implements QuestionCategoryService {

    @Autowired
    private QuestionCategoryMapper questionCategoryMapper;

    @Autowired
    private  SortandtopicMapper sortandtopicMapper;


    /**
     * 题目分类管理的查询
     * @param category
     * @return IPage<InterviewCategoryDTO>
     */
    @Override
    public IPage<InterviewCategoryDTO> selectCategoryWithQuestionCount(QuestionCategory category) {
        // 创建分页对象，用于查询分类表
        IPage<QuestionCategory> questionCategoryPage = new Page<>(category.getPageNum(), category.getPageSize());
        // 执行分类表的分页查询，这里传入 null 表示没有额外的查询条件
        IPage<QuestionCategory> IPage = questionCategoryMapper.selectPage(questionCategoryPage, null);

        // 创建一个新的分页对象，用于存储最终的结果（包含问题数量）
        Page<InterviewCategoryDTO> interviewCategoryDTOPage = new Page<>();
        // 设置分页信息（每页大小）
        interviewCategoryDTOPage.setSize(IPage.getSize());
        // 设置分页信息（当前页码）
        interviewCategoryDTOPage.setCurrent(IPage.getCurrent());
        // 设置分页信息（总页数）
        interviewCategoryDTOPage.setPages(IPage.getPages());
        // 设置分页信息（总记录数）
        interviewCategoryDTOPage.setTotal(IPage.getTotal());
        // 再次设置当前页码（可能是为了确保数据一致性，尽管之前已经设置过）
        interviewCategoryDTOPage.setCurrent(IPage.getCurrent());
        ArrayList<InterviewCategoryDTO> interviewCategoryDTOPages = new ArrayList<>();
        // 获取查询到的分类记录
        List<QuestionCategory> records = IPage.getRecords();
        // 循环遍历每个分类
        for (QuestionCategory record : records) {
            // 创建查询条件，用于查询 Sort_topic 表
            QueryWrapper<SortTopic> sortTopicQueryWrapper = new QueryWrapper<>();
            // 设置查询条件：Sort_topic 表中的 sort_id 等于当前分类的 id
            sortTopicQueryWrapper.select("sort_id", "count(topic_id) AS topic_id").eq("sort_id", record.getId()).groupBy("sort_id");
            List<Map<String, Object>> maps = sortandtopicMapper.selectMaps(sortTopicQueryWrapper);
            // 获取查询结果中的第一条记录（每个分类只会有一个结果统计）
            if (!(maps.size() == 0 && maps.isEmpty())){
                Map<String, Object> stringObjectMap = maps.get(0);
                // 获取 topic_id 的值（即问题数量）
                Object topicId = stringObjectMap.get("topic_id");
                // 获取 sort_id 的值（用于验证是否匹配当前分类）
                Object sortId =  stringObjectMap.get("sort_id");
                // 将 topic_id 转换为整数类型
                int value = Integer.parseInt(topicId.toString());
                // 将 sort_id 转换为整数类型
                int value1 = Integer.parseInt(sortId.toString());

                // 将当前分类对象转换为 InterviewCategoryDTO 对象
                InterviewCategoryDTO interviewCategoryDTO = record.toInterviewCategoryDTO();
                // 设置问题数量到 DTO 对象中
                interviewCategoryDTO.setQuestionCount(value);
                // 将 DTO 对象添加到结果列表中
                interviewCategoryDTOPages.add(interviewCategoryDTO);
            }else{
                InterviewCategoryDTO interviewCategoryDTO = record.toInterviewCategoryDTO();
                interviewCategoryDTO.setQuestionCount(0);
                interviewCategoryDTOPages.add(interviewCategoryDTO);
            }

        }
        // 设置最终的分页结果列表
        interviewCategoryDTOPage.setRecords(interviewCategoryDTOPages);
        // 返回分页结果对象
        return interviewCategoryDTOPage;
    }
}